Published on March 27, 2025

备用返回通道

转到题目

思路

我们想用最少的次数,那怎么样减少使用魔法是次数呢? 答案是对于连续元素越多越好,这样我们就尽可能大的正贡献 怎么样保证对足够多的连续元素施法过?

因此:对于每一步,我们可以让竹子都先砍到他们的”最高共同高度” 应该怎么实现呢? 子区间都是连续元素组成的,因此 如果我们保证每一个最小的子区间,连续元素之间都要保证”最高共同高度”的性质 这样后:

都会遵循这个 因此我们只要维护每两个连续元素之间的"最高共同高度"准则就可以”

代码


#include <bits/stdc++.h>
using namespace std;
#define int long long
int res =0;
int n;

signed main(){
  cin>>n;
  unordered_set<long long>pre;
  for(int i =0;i<n;i++){
    int tmp;
    cin>>tmp;
    unordered_set<long long>st;
    while(tmp!=1){
      st.insert(tmp);
      if(!pre.count(tmp))res++;
      tmp = sqrtl(tmp/2+1);
    }
    pre = st;
  }
  cout<<res<<endl;
  return 0;
}